simple_salesforceを使ってPythonからSalesforceのREST APIへアクセスしてみた
はじめに
こんにちは植木和樹@上越妙高オフィスです。今回はPythonからSalesforceのREST APIを叩くための準備作業についての備忘録です。
ひょんなことからSalesforceへデータ投入することになりました。Salesforceへのデータ投入へはData Loaderやcliを使えばできますが、今回は元データに対して色々処理をしてからデータ投入する必要があったので、スクリプト経由で使ってみることにします。
プログラミング言語はPythonを選択しました。
Salesforce Python SDKについて
いろいろ調べてみたところ、SalesforceをPythonから叩くためのSDKは何種類かでているようです。 今回はsimple_salesforceというモジュールを使うことにしました。
採用の理由
- 現在も活発に開発が行われている
- 最初に試した htarevern/salesforce-python-sdk: Salesforce Python SDK という別モジュールと使い方が似てる
- コードが単純で裏で何してるかわかりやすかった
準備と設定
接続アプリケーションを作成
最初にSalesforceの管理画面で接続アプリケーションを作成してコンシューマ鍵(client_id)とコンシューマの秘密(client_secret)を取得しておきます。この辺はややこしいので省略してさらっと概要だけ。
- ページ右上の「設定」 → 「ビルド」セクション /作成/アプリケーション → 接続アプリケーションの「新規」から作成
- 接続アプリケーションの作成 を見ながらOAuthの設定
- アプリケーションを作成すると表示されるコンシューマの鍵と秘密をメモっておく
simple_salesforceモジュールのインストール
simple_salesforceはpipでインストールできます。環境を汚したくないのでpyenvとvirtualenvを使って実行環境配下(lambda)にモジュールをインストールします。
$ pyenv install 2.7.11 $ mkdir ~/sfproject $ cd ~/sfproject $ pyenv local 2.7.11 $ pip install virtualenv $ virtualenv lambda $ source lambda/bin/activate $ cat > requirements.txt requests simple_salesforce $ pip install -r requirements.txt
これでsimple_salesforceのバージョン0.68.2がインストールされます。
動作確認
Salesforce接続用設定ファイル
以下の内容でSalesforceに接続するための設定ファイルを作っておきます。今回はユーザークレデンシャルを使った認証・認可をしています。サンドボックスにログインする場合はユーザー名とアクセストークンのURLが変わってくるので注意。
client_id = "<コンシューマの鍵>" client_secret = "<コンシューマの秘密>" username = "<SalesforceのログインID>" password = "<Salesforceのパスワード>" sandbox = False access_token_url = 'https://login.salesforce.com/services/oauth2/token' if sandbox: username="<SalesforceのログインID>.<サンドボックス名>" access_token_url = 'https://test.salesforce.com/services/oauth2/token'
動作確認Pythonスクリプト
設定ファイルを作ったら動作確認してみましょう。以下のファイルをsf_describe_objects.pyという名前で保存します。Salesforceのオブジェクト一覧を表示してくれます。
#!/usr/bin/env python # -*- coding: utf-8 -*- from simple_salesforce import Salesforce import requests #-------------------------------------------------------------------------------- # 初期化処理 #-------------------------------------------------------------------------------- sf_conf = {} execfile("salesforce.conf", sf_conf) #-------------------------------------------------------------------------------- # クラス・関数宣言 #-------------------------------------------------------------------------------- def lambda_handler(event, context): """ SalesforceにOauth2を使ってログインし、オブジェクト一覧を表示します """ access_token_url = sf_conf["access_token_url"] data = { 'grant_type': 'password', 'client_id' : sf_conf["client_id"], 'client_secret' : sf_conf["client_secret"], 'username' : sf_conf["username"], 'password' : sf_conf["password"] } headers = { 'content-type': 'application/x-www-form-urlencoded' } response = requests.post(access_token_url,data=data,headers=headers) response = response.json() if response.get('error'): raise Exception(response.get('error_description')) session = requests.Session() sf = Salesforce(instance_url = response['instance_url'], session_id=response['access_token'], sandbox=sf_conf["sandbox"], session=session) result = sf.describe() if len(result['sobjects']): for record in result['sobjects']: print u"%s: %s" % (record['name'], record['label']) # メイン関数 if __name__ == "__main__": lambda_handler({}, {})
実行結果
スクリプトを実行してみます。
$ chmod +x ./sf_describe_objects.py $ ./sf_describe_objects.py AcceptedEventRelation: 参加行動リレーション Account: 顧客 AccountContactRole: 顧客責任者の役割 AccountFeed: 取引先フィード AccountHistory: 顧客履歴 AccountPartner: 顧客パートナー AccountShare: 取引先の共有 ActivityHistory: 活動履歴 AdditionalNumber: 追加ディレクトリ番号 : :
オブジェクトの一覧が表示されれば成功です!
まとめ
ひとまずsimple_salesforceモジュールを使ってログインするところまで確認できました。このモジュールを使えば、INSERT/UPDATE/Upsert/DELETEの他、SOQLを使ったレコードの検索などもできます。
さて、PythonからSalesforceへアクセスできるようになりましたが、実際の処理ではSOQLとかを駆使して実装することになります。これについてはまた別の機会に。